/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webhomesites.padrao.presenter;

import br.com.webhomesites.padrao.contracts.IProdutoDAO;
import br.com.webhomesites.padrao.contracts.IProdutoPresenter;
import br.com.webhomesites.padrao.contracts.IProdutoView;
import br.com.webhomesites.padrao.model.ProdutoModel;
import br.com.webhomesites.padrao.presenter.ProdutoPresenterActionListeners.AlterarActionListener;
import br.com.webhomesites.padrao.presenter.ProdutoPresenterActionListeners.CancelarActionListener;
import br.com.webhomesites.padrao.presenter.ProdutoPresenterActionListeners.InserirActionListener;
import br.com.webhomesites.padrao.presenter.ProdutoPresenterActionListeners.RemoverActionListener;
import br.com.webhomesites.padrao.presenter.ProdutoPresenterActionListeners.SairActionListener;
import br.com.webhomesites.padrao.presenter.ProdutoPresenterActionListeners.SalvarActionListener;
import br.com.webhomesites.padrao.utils.Strategy;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Webhome
 */
public class ProdutoPresenter implements IProdutoPresenter{
    
    private ProdutoModel produtoModel;
    private IProdutoDAO produtoDAO;
    private IProdutoView produtoView;
        
    public final Strategy INSERT_STRATEGY = new InsertStrategy();  
    public final Strategy UPDATE_STRATEGY = new UpdateStrategy();  
    
    private Strategy operacao = INSERT_STRATEGY;
    
    public ProdutoPresenter(ProdutoModel produtoModel, IProdutoView produtoView, IProdutoDAO produtoDAO) {
        this.produtoModel = produtoModel;
        this.produtoView = produtoView;
        this.produtoDAO = produtoDAO;             
    }
    
    @Override
    public void setUpViewListeners() {
        produtoView.setInserirActionListener(new InserirActionListener(this));  
        produtoView.setRemoverActionListener(new RemoverActionListener(this));  
        produtoView.setAlterarActionListener(new AlterarActionListener(this));  
        produtoView.setCancelarActionListener(new CancelarActionListener(this));  
        produtoView.setSalvarActionListener(new SalvarActionListener(this));  
        produtoView.setBtnSairActionListener(new SairActionListener());
    }

    @Override
    public void updateModelFromView() {
        produtoModel.setCodigo(produtoView.getCodigo());
        produtoModel.setDescricao(produtoView.getDescricao());
        produtoModel.setSerie(produtoView.getSerie());
        produtoModel.setPrecoDiario(Double.parseDouble(produtoView.getPrecoDiario()));
        produtoModel.setPrecoSemanal(Double.parseDouble(produtoView.getPrecoSemanal()));
        produtoModel.setPrecoQuinzenal(Double.parseDouble(produtoView.getPrecoQuinzenal()));
        produtoModel.setPrecoMensal(Double.parseDouble(produtoView.getPrecoMensal()));
        //System.out.println(produtoModel.toString());               
        produtoDAO.inserirProduto(produtoModel);
        System.out.println("******Listagem do produto inserido");
        System.out.println(produtoModel.toString());
        
    }

    @Override
    public void updateViewFromModel() {
        if (produtoModel != null) {  
            produtoView.setCodigo(produtoModel.getCodigo());  
            produtoView.setDescricao(produtoModel.getDescricao());  
            produtoView.setSerie(produtoModel.getSerie());  
            produtoView.setPrecoDiario(Double.toString(produtoModel.getPrecoDiario()));
            produtoView.setPrecoSemanal(Double.toString(produtoModel.getPrecoDiario()));
            produtoView.setPrecoQuinzenal(Double.toString(produtoModel.getPrecoDiario()));
            produtoView.setPrecoMensal(Double.toString(produtoModel.getPrecoDiario()));
            
            
        }  
        else {  
            produtoView.clearFields();  
        }
    }

    @Override
    public void novoProduto() {
        produtoModel = new ProdutoModel(this.produtoDAO);
    }

    @Override
    public void inserirProduto() {
        this.updateModelFromView(); 
        produtoView.clearFields();
    }

    @Override
    public void alterarProduto() {
        this.updateModelFromView();
    }

    @Override
    public void removerProduto() {
         this.updateModelFromView();
    }

    @Override
    public void habilitarEdicao(boolean arg) {
        produtoView.enableTxtProdutoCodigo(arg);
        produtoView.enableTxtProdutoDescricao(arg);
        produtoView.enableTxtProdutoSerie(arg);
        produtoView.enableTxtProdutoPrecoDiario(arg);
        produtoView.enableTxtProdutoPrecoSemanal(arg);
        produtoView.enableTxtProdutoPrecoQuinzenal(arg);
        produtoView.enableTxtProdutoPrecoMensal(arg); 
                   
        produtoView.enableBtnCancelar(arg);
        produtoView.enableBtnRemover(arg);
        produtoView.enableBtnSalvar(arg);        
    }

    @Override
    public IProdutoView getView() {
        return produtoView;
    }
    
    @Override
    public ProdutoModel getModel() {
        return produtoModel;
    }
    
    @Override
    public void setView(IProdutoView produtoView) {
        this.produtoView = produtoView;
    }

    @Override
    public void setModel(ProdutoModel model) {
        this.produtoModel = model;
    }

    @Override
    public void createView() {
        //this.novoProduto();            
        this.setUpViewListeners();  
        //this.habilitarEdicao(false);
        List<String> listaTipos = new ArrayList<>();
        listaTipos.add("Furadeirra");
        listaTipos.add("Britadeira");
        produtoView.setTipo(listaTipos);
        produtoView.packAndShow();
    }    
    
   
    public void setOperacao(Strategy operacao) {
        this.operacao = operacao;
    }

    public Strategy getOperacao() {
        return operacao;
    }
            
     private class InsertStrategy implements Strategy {  
        @Override
        public void execute() {  
            inserirProduto();  
        }  
    }        
      
    private class UpdateStrategy implements Strategy {  
        @Override
        public void execute() {  
            alterarProduto();  
        }  
    }    
}
